#include "SList.h"


void SListPrint(SListNode* phead)
{
	SListNode* cur=phead;

	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}


SListNode* BuySListNode(SListDataType x)
{
	SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));
	if (newNode == NULL)
	{
		printf("申请失败\n");
		exit(-1);
	}
	newNode->data = x;
	newNode->next = NULL;
	return newNode;
}

//
void SListPushBack(SListNode** pphead, SListDataType x)
{
	SListNode* newNode = BuySListNode(x);
	if (*pphead == NULL)
	{

		*pphead = newNode;//
	}
	else
	{
	SListNode* tail = *pphead;
	while (tail->next != NULL)
	{
		tail = tail->next;
	}
		tail->next = newNode;
	}

}


void SListPopBack(SListNode** pphead)
{
	
	if (*(pphead) == NULL)
	{
		return;
	}
	
	else if ((*pphead)->next==NULL)
	{
		free((*pphead));
		*pphead = NULL;
	}
	else
	{
		SListNode* cur = *pphead;
		SListNode* end = NULL;
		while (cur->next!=NULL)
		{
			
			end = cur;
			cur = cur->next;
		}
		
		free(cur);
		end->next = NULL;
	}
}



void SListPushFront(SListNode** pphead, SListDataType x)
{
	SListNode* newNode = BuySListNode(x);
	newNode->next = *pphead;
	*pphead = newNode;
}

void SListPopFront(SListNode** pphead)
{
	if (*pphead == NULL)
	{
		return;
	}
	SListNode* cur = *pphead;
	*pphead = (*pphead)->next;
	free(cur);

}

// 单链表查找
SListNode* SListFind(SListNode* phead, SListDataType x)
{
	SListNode* cur = phead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur=cur->next;
	}
	return NULL;
}

// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SListDataType x)
{
	SListNode* newNode = BuySListNode(x);
	newNode->next = pos->next;
	pos->next = newNode;
}

// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos)
{
	if (pos->next)
	{
		SListNode* next = pos->next;
		SListNode* nextnext = next->next;
		pos->next = nextnext;
		free(next);
	}
}